
import com.cbw.bean.Express;
import com.cbw.client.ExpressClient;
import com.cbw.view.Views;

import java.io.IOException;
import java.util.ArrayList;

//主流程控制，先给出各个功能方法，写好整个流程后再实现各个功能
public class Main {
    static Views v=new Views(); //视图层对象
    static ExpressClient client=new ExpressClient();//客户端对象
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        v.welcome();
        boolean flag=true;//循环开关
        while(flag){
            v.showMainMenu();//显示主菜单
            int key=v.inputKey(3);//用户输入功能号
            switch(key){ //执行对应的功能
                case 1:
                    adminLoop(); //进入管理员菜单循环
                    break;
                case 2:
                    userLoop();//进入用户菜单循环
                    break;
                case 3:
                    flag=false; //关闭循环开关，退出程序
                    client.close();//客户端关闭socket
                    break;
            }

        }
    }



    /**
     * 1.进入管理员子菜单循环
     */
    private static void adminLoop() throws IOException, ClassNotFoundException {
        boolean flag = true;//循环开关
        while (flag) {
            v.showAdminMenu();//显示管理员子菜单
            int key = v.inputKey(5);//用户输入功能号
            //System.out.println("key:"+key);
            switch (key) { //执行对应的功能(case退出switch)
                case 1:
                    addExpress();
                    break;
                case 2:
                    removeExpress();
                    break;
                case 3:
                    modifyExpress();
                    break;
                case 4:
                    findAllExpresses();
                    break;
                case 5:
                    flag=false; //关闭循环开关，退出子菜单
                    break;
            }
        }

    }

    private static void findAllExpresses() throws IOException, ClassNotFoundException {
        ArrayList<Express>list=client.findAll();//客户端向服务器要数据并传递过来
        v.showList(list);//视图层来展示数据
    }

    /**
     * 修改快递信息
     * 需要通过客户端将单号传递给服务器去查有没有这个单号
     * 服务器将查询结果返回客户端再返回到主流程这里
     */
    private static void modifyExpress() throws IOException, ClassNotFoundException {
        String number = v.inputNumber();//在视图层输入单号
        if (client.findByNumber(number)==-1){
            v.printNone();//视图层给出提示
            return;//结束该次修改操作
        }
        //单号存在
        Express express = v.inputExpress();
        Express modify=client.modifyExpress(new Express(number,null),express);//服务器返回修改后对象
        v.printResultModify(modify);//在客户端显示是否修改成功
    }

    /**
     * 删除快递信息
     * 也是通过客户端将待删除信息传递给服务器去删除
     */
    private static void removeExpress() throws IOException {
        String number=v.inputNumber(); //视图层输入待删除快递单号
        Boolean remove=client.removeExpress(number);//客户端将单号传递给服务器删除并接收回写
        v.printResultRemove(remove);
    }

    /**
     * addExpress()添加快递的实现:
     *   0.先去服务器查看快递柜是否满了，不满才能添加
     *   1.从视图层(控制台)获取数据到客户端
     *     获取快递单号，公司名称。(取件号和存储位置由程序负责)
     *   2.客户端通过客户端对象将数据发给服务器
     *   3.接收服务器回写数据，交给视图层展示
     */
    private static void addExpress() throws IOException, ClassNotFoundException {
        //添加前向服务器确认是否满了
        if (client.isFull()){ //快递柜满了
            v.full();  //在视图层给出提示
            return;
        }
        Express express=v.inputExpress();//视图层来添加快递信息
        Express add=client.addExpress(express);//客户端对象将快递发送给服务器
        v.printResultAdd(add); //接收服务器回写数据(回写的是快递对象)，交给视图层展示
    }

    /**
     * 2.进入用户子菜单循环
     */
    private static void userLoop() throws IOException, ClassNotFoundException {
        boolean flag=true;//循环开关
        while(flag){
            v.showUserMenu(); //展示用户子菜单
            int key = v.inputKey(2);//用户输入功能号
            switch (key){ //switch执行相应功能
                case 1:
                    pickExpress();
                    break;
                case 2:
                    flag=false;//关闭循环开关，退出子菜单
                    break;
            }
        }
    }

    /**
     * 用户取快递
     */
    private static void pickExpress() throws IOException, ClassNotFoundException {
        int code=v.inputCode();//在视图层输入取件码
        Express express=client.pickExpress(code);//客户端命令服务器取出快递并返回
        v.printResultPick(express);//视图层显示取件结果
    }
}